﻿using BLL.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Sgf.View.Relatorio
{
    public partial class RelPreview : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var validateReport = !String.IsNullOrEmpty(Request.Form["nome"]) || (!String.IsNullOrEmpty(Request.QueryString["nome"]) ? true : false);

            if (!validateReport) return;
            var relatorio = !String.IsNullOrEmpty(Request.Form["nome"]) ? Request.Form["nome"] : Request.QueryString["nome"];

            var cr = new CrystalReports();
            var reportIsLoaded = cr.ReportIsLoaded(String.Format("{0}{1}.rpt", ConfiguracaoWeb.ReportPath(), relatorio));
            var reportParametersIsValid = SetarParametros(cr);

            // Verifica se o relatório foi carregado, se os parâmetros são válidos e cria um objeto de sessão para sua validação.
            if (reportIsLoaded && reportParametersIsValid)
            {
                Session["reportExported"] = true;
                ExibirRelatorio(cr);
            }
            else
            {
                Session["reportExported"] = false;
                ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "alertPage", "alert('Não foi possível exibir o relatório solicitado. Por favor, entre em contato com o administrador do sistema.');", true);
                ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "closePage", "window.close();", true);
            }
        }

        #region -- Nova Rotina para setar parametros do relatório --
        private bool SetarParametros(CrystalReports cr)
        {
            // Captura a lista de parâmetros.
            var listaParametro = Request.Form.Count > 0 ? Request.Form.ToString().Split('&') : ClientQueryString.Split('&');

            // Pecorre a lista de parâmetros começando pelo índice 1 pois o 0 é o nome do relatório.
            for (var i = 1; i < listaParametro.Length; i++)
            {
                // Captura os parâmetros do objeto corrente, removendo o caractere especial.
                var parametros = listaParametro[i].Split('=');

                // Captura o nome e o valor do parâmetro.
                var nomeParametro = parametros[0];
                var valorParametro = Request.Form.Count > 0 ? Request.Form[parametros[0]] : Request.QueryString[parametros[0]];

                if (!nomeParametro.Equals("DXScript"))
                {
                    // Atribui o nome e o seu valor do parâmetro no relatório.
                    cr.SetParameter(nomeParametro, valorParametro);
                }
            }

            // Passa a quantidade de parâmetros do relatório principal mais os parâmetros fixos que são: "pLogotipo", "pNomeInst" e "pEmpresaId".
            // Obs: O nome do relatório não deve ser considerado como parâmetro.
            return cr.ReportParametersIsValid(((listaParametro.Length - 1)));
        }

        private static void ExibirRelatorio(CrystalReports pReport)
        {
            // Exporta para o formato pdf e retorna confirmação de exibição.
            pReport.ExportToPDF();
        }
        #endregion

    }
}